#ifndef __ENP_DEFINE_H__
#define __ENP_DEFINE_H__

#include "CTBase.h"
#include "CTBuffer.h"
#include "CTStat.h"
#include "CTSizeString.h"
#include "CTArray.h"
#include "CTObjectMgr.h"
#include "CTShmQueue.h"
#include "net/CTEpoll.h"
#include "CTMsgBase.h"
#include "CTConfig.h"
#include "CTServerUtils.h"

/*
* 2008-06-16 去掉主动连接、断线重连特性，不再支持windows下运行，只要能编译就行
*/

using namespace CTLib;

//===============================================
// 相关文件的定义，做为一个约定，不用在配置文件中读取

#define APPNAME             "enpsvr"
#define FILE_CONFIG         "../config/" APPNAME ".conf"
#define FILE_NORMALLOG      "../log/" APPNAME ".log"
#define FILE_ERRORLOG       "../log/" APPNAME ".err"
#define FILE_STATLOG        "../log/" APPNAME ".sta"
#define FILE_PIDFILE        "./" APPNAME ".pid"
// FILE_PIDFILE不要直接用../bin/, 原因是enpsvr一般是和其他svr一起配合使用.
// 那时的目录划分如下: bin enp config log
// bin是其他svr的bin文件, enp是enpsvr的bin文件, 这两个svr的config和log共享
// 为什enpsvr和其他svr不能共享bin目录呢? 主要是管理脚本重名问题
// 如果把管理脚本改为其他名字, 也可以共享bin目录

#define CHECK_RETURN(iRet)  do { if (iRet) { return iRet; } } while(0)
#define CHECK_EXIT(iRet) do { if (iRet) { exit(iRet); } } while(0)
#define CHECK_THROW(iRet) do { if (iRet) { CT_THROW((iRet)); } } while(0)

//===============================================
enum enp_const
{
    MAX_IPLEN =             32,
	ENP_MAX_LISTEN =		8,		///< 最多能侦听ENP_MAX_LISTEN个端口
	ENP_MAX_WEB_COUNT =	    8,		///< 最多能转发ENP_MAX_WEB_COUNT个页面
	ENP_MAX_SHM_QUEUE =		16,		///< 最多能连接ENP_MAX_SHM_QUEUE个队列
	ENP_WAIT_SIZE  =		1024,
    ENP_FILE_LENGTH =       4096,
};

class CEnpListenInfo
{
public:
    CEnpListenInfo()
    {
        m_stBufferofPolicy.Attach(m_stPolicyFile.GetBuffer(),
            m_stPolicyFile.GetBufferLen(), 0);
    }

public:
	CTSizeString<64>	m_szListenIP;		///< 侦听的IP
	unsigned short		m_unListenPort;		///< 侦听的端口
	unsigned int		m_uiIdleTimeout;	///< 发呆超时值, 默认为-1, 即不检测发呆, accepte的sock会继承此值
    EEnpPackage	        m_stPackageType;    ///< 数据包的格式
    CTBuffer            m_stBufferofPolicy; ///< 策略文件的另一个对象
    unsigned char       m_ucEncodeMethod;     ///< 消息体编码方法
    unsigned char       m_ucDecodeMethod;     ///< 消息体解码方法

private:
    CTSizeString<ENP_FILE_LENGTH>  m_stPolicyFile;     ///< 策略文件
};

//===============================================
// 这两个定义是为了能够在Windows下编译
#ifdef WIN32
    #define signal(signum, handler) (0)
    #define getopt(argc, argv, optstring) (0)

    #define SIGUSR1 10
    #define SIGUSR2 12
#else
    #include <sys/types.h>
    #include <signal.h>
#endif

//===============================================
// 统计项的定义

// 统计的CTLog
#define CT_STAT (CTLib::CTSingleton<CTLib::CTLog, 2>::Instance())

/**
* 统计项.
* 必须以0开始顺序编号, 方便和描述的下标对应
*/
enum EEnpStat
{
	enp_stat_recvmsg = 0,
	enp_stat_sendmsg,
	enp_stat_accept,
	enp_stat_idleclose,
	enp_stat_mainloop,
	enp_stat_waittimeout,
	enp_stat_check,
};

#endif //__ENP_DEFINE_H__
